什么是目录

目录是一种特殊的文件, 它的内容是文件和目录的名字. 它包含很多记录, 每个记录的格式由统一的标准定义.每条记录代表一个文件或目录

与普通文件不同的是, 目录文件永远不会空, 每个目录都至少包含两个特殊的项 ---- "." 和 "..", 分别表示当前目录和上一级目录

目录操作

目录可以被 openreadclose 打开

实际上用openreadclose 这些系统调用来操作目录兵士很好的方法, Unix 支持多种目录类型, 如果用 read 来读, 那么需要了解这些不同类型目录各自的结构细节

如何读取目录

可以在联机帮助中根据关键字 direct 来查找答案

$ man -k direct

过滤一下

$ man -k direct | grep read

找到 readdir

$ man 3 reddir

通过返回可以知道, 从目录数据与从文件读数据是类似的, opendir 打开一个目录, readdir 返回目录中的当前项, closedir 关闭一个目录, seekdir, telldir, rewinddir 与 lseek 的功能类似

目录是文件的列表, 更确切的说, 是记录的序列, 每条记录对应一个文件或子目录. 通过 readdir 来读取目录中的记录, readdir 返回一个指向目录的当前记录的指针, 记录的类型是 struct dirent, 这个结构定义在 /usr/include/dirent.h 中

ls.1

根据上面知识可以写出一个 ls1.c

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

void do_ls(char []);

    int
main( int argc, char **argv )
{
    if (argc == 1)
        do_ls(".");
    else
        while (--argc){
            printf("%s:\n", *++argv);
            do_ls(*argv);
        }
    return 0;
}

void do_ls(char dirname[])
{
    DIR *dir_ptr;
    struct dirent *direntp;

    if ((dir_ptr = opendir(dirname)) == NULL)
        fprintf(stderr, "ls1: cannot open %s\n", dirname);
    else
        while ((direntp = readdir(dir_ptr)) != NULL)
            printf("%s\n", direntp->d_name);
    closedir(dir_ptr);
}